package rn;

import classes.Tarefa;
import erro.ConexaoException;
import erro.ConsultaException;
import fachada.Fachada;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 *
 * @author Roberta
 */
public class TarefaStatus {

    public TarefaStatus() throws ConexaoException, ConsultaException {       
    }  

    public static ArrayList<Tarefa> alterarStatus() throws ConexaoException, ConsultaException {
        Fachada f = new Fachada();
        Tarefa t = new Tarefa();
        ArrayList<Tarefa> listaS = new ArrayList<Tarefa>();
        listaS = f.listarStatus();        
            for (int d = 0; d < listaS.size(); d++) {
                if (listaS.get(d).getDataConclusão() != null) {
                    t.setStatus(7);
                    f.alterarStatus(t);
                } else {
                    Date dataInclusao = listaS.get(d).getDataInclusão();//Recebe a data de inclusão da Tarefa.
                    Date dataI = listaS.get(d).getDataInicial();//Recebe a data dinicial da Tarefa.
                    Date dataF = listaS.get(d).getDataPrevista();//Recebe a data final da Tarefa
                    GregorianCalendar calendar = new GregorianCalendar();
                    Date dataAtual = calendar.getTime();
                    if (dataI != null) {
                        //Tarefa Iniciada.
                        long diferenceTotal = dataF.getTime() - dataI.getTime();//Calcula a diferença entre a final e inicial.
                        int tempoTotal = (int) (diferenceTotal / 1000 / 60 / 60 / 24);//Transforma em dias.
                        Date data = calendar.getTime();//Pega a data atual do sistema.
                        long diference = data.getTime() - dataI.getTime();//Calcula a diferença entre a data atual e inicial.
                        int decorrido = (int) (diference / 1000 / 60 / 60 / 24);//Transforma em dias.
                        if (decorrido == 0) {
                            listaS.get(d).setStatus(3);//Com menos de 50% do tempo decorrido.
                            t.setTarefa_id(listaS.get(d).getTarefa_id());
                            t.setStatus(listaS.get(d).getStatus());

                            f.alterarStatus(t);
                            if (dataF.getTime() == dataI.getTime()) {
                                listaS.get(d).setStatus(4);
                                t.setTarefa_id(listaS.get(d).getTarefa_id());
                                t.setStatus(listaS.get(d).getStatus());
                                f.alterarStatus(t);
                            }

                        } else if (tempoTotal == 0) {
                            listaS.get(d).setStatus(5);//Acima de 100% do tempo decorrido. Vencida.
                            t.setTarefa_id(listaS.get(d).getTarefa_id());
                            t.setStatus(listaS.get(d).getStatus());

                            f.alterarStatus(t);

                        } else {
                            int soma = (100 * decorrido) / tempoTotal;//Calcula quantos % de dias decorridos.    

                            if (soma != 0 && soma <= 50) {
                                listaS.get(d).setStatus(3);//Com menos de 50% do tempo decorrido.
                                t.setTarefa_id(listaS.get(d).getTarefa_id());
                                t.setStatus(listaS.get(d).getStatus());

                                f.alterarStatus(t);

                            }
                            if (soma > 50 && soma <= 100) {
                                listaS.get(d).setStatus(4);//Entre 51% e 100% do tempo decorrido.
                                t.setTarefa_id(listaS.get(d).getTarefa_id());
                                t.setStatus(listaS.get(d).getStatus());

                                f.alterarStatus(t);

                            }
                            if (soma > 100) {
                                listaS.get(d).setStatus(5);//Acima de 100% do tempo decorrido. Vencida.
                                t.setTarefa_id(listaS.get(d).getTarefa_id());
                                t.setStatus(listaS.get(d).getStatus());

                                f.alterarStatus(t);

                            }
                        }
                    } else {
                        //Tarefa não iniciada.
                        long naoIniciada = dataAtual.getTime() - dataInclusao.getTime();
                        int status1 = (int) (naoIniciada / 1000 / 60 / 60 / 24);


                        if (status1 <= 1) {
                            listaS.get(d).setStatus(0);//Antes 24h da inclusão.
                            t.setTarefa_id(listaS.get(d).getTarefa_id());
                            t.setStatus(listaS.get(d).getStatus());

                            f.alterarStatus(t);

                        }
                        if (status1 > 1 && status1 < 5) {
                            listaS.get(d).setStatus(1);//Após 24h da inclusão.
                            t.setTarefa_id(listaS.get(d).getTarefa_id());
                            t.setStatus(listaS.get(d).getStatus());

                            f.alterarStatus(t);

                        }
                        if (status1 >= 5) {
                            listaS.get(d).setStatus(2);//Após 5 dias da data de inclusão.
                            t.setTarefa_id(listaS.get(d).getTarefa_id());
                            t.setStatus(listaS.get(d).getStatus());

                            f.alterarStatus(t);
                        }
                    }
                }
            }        
        return listaS;
    }
}
